﻿//----------------------------------------------------------------
// Copyright (C) 2011-2012 TaoSys软件有限责任公司
// All rights reserved.
//
// 文件名：XConfiguration.cs
// 摘  要：配置管理类
// 说  明：提供了配置读写功能
//

//当前版本：1.0
//作    者：陶剑扬
//完成日期：2011-07-09
//----------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Web;

namespace PowerSys.SystemFramework.ConfigurationManagment
{
    /// <summary>
    /// 配置类型
    /// </summary>
    public enum ConfigType
    {
        /// <summary> 
        /// asp.net网站的config文件 
        /// </summary> 
        WebConfig,
        /// <summary> 
        /// Windows应用程序的config文件 
        /// </summary> 
        WinConfig
    }

    public class XConfiguration
    {
        private const string NULL_TEXT = "不存在此配置节点";

        private string configPath;
        private ConfigType configType;
        private Configuration m_config;
        private AppSettingsSection m_appSetting;

        /// <summary> 
        /// 构造函数 
        /// </summary> 
        /// <param name="configType">.config文件的类型，只能是网站配置文件或者应用程序配置文件</param> 
        public XConfiguration(ConfigType configType)
        {
            this.configType = configType;
            if (configType == ConfigType.WinConfig)
            {
                configPath = AppDomain.CurrentDomain.BaseDirectory; 
            }
            else
            {
                configPath = HttpContext.Current.Request.ApplicationPath;
            }
            Initialize();
        }

        /// <summary> 
        /// 构造函数 
        /// </summary> 
        /// <param name="path">.config文件的位置</param> 
        /// <param name="type">.config文件的类型，只能是网站配置文件或者应用程序配置文件</param> 
        public XConfiguration(string configPath, ConfigType configType)
        {
            this.configPath = configPath;
            this.configType = configType;
            Initialize();
        }

        /// <summary>
        /// 实例化Configuration, 根据配置文件类型的不同, 分别采取了不同的实例化方法 
        /// </summary>
        private void Initialize()
        {
            //如果是WinForm应用程序的配置文件 
            if (configType == ConfigType.WinConfig)
            {
                m_config = System.Configuration.ConfigurationManager.OpenExeConfiguration(configPath);
            }
            else//WebForm的配置文件 
            {
                m_config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(configPath);
            }

            m_appSetting = m_config.AppSettings;
        }

        /// <summary> 
        /// 添加应用程序配置节点，如果已经存在此节点，则会修改该节点的值 
        /// </summary> 
        /// <param name="key">节点名称</param> 
        /// <param name="value">节点值</param> 
        public void AddAppSetting(string key, string value)
        {
            if (m_appSetting.Settings[key] == null)//如果不存在此节点，则添加 
            {
                m_appSetting.Settings.Add(key, value);
            }
            else//如果存在此节点，则修改 
            {
                SetAppSetting(key, value);
            }
        }

        /// <summary> 
        /// 添加数据库连接字符串节点，如果已经存在此节点，则会修改该节点的值 
        /// </summary> 
        /// <param name="key">节点名称</param> 
        /// <param name="value">节点值</param> 
        public void AddConnectionString(string key, string connectionString)
        {
            ConnectionStringsSection connectionSetting = (ConnectionStringsSection)m_config.ConnectionStrings;
            if (connectionSetting.ConnectionStrings[key] == null)//如果不存在此节点，则添加 
            {
                ConnectionStringSettings connectionStringSettings = new ConnectionStringSettings(key, connectionString);
                connectionSetting.ConnectionStrings.Add(connectionStringSettings);
            }
            else//如果存在此节点，则修改 
            {
                SetConnectionString(key, connectionString);
            }
        }

        /// <summary> 
        /// 获取配置节点信息，如果不存在此节点，则抛出异常 
        /// </summary> 
        /// <param name="key">节点名称</param> 
        public string GetAppSetting(string key)
        {
            if (m_appSetting.Settings[key] != null)//如果存在此节点，则修改 
            {
                return m_appSetting.Settings[key].Value;
            }
            else//如果不存在此节点，则抛出异常 
            {
                throw new Exception(NULL_TEXT + key);
            }
        }

        /// <summary> 
        /// 修改应用程序配置节点，如果不存在此节点，则会添加此节点及对应的值 
        /// </summary> 
        /// <param name="key">节点名称</param> 
        /// <param name="value">节点值</param> 
        public void SetAppSetting(string key, string value)
        {
            if (m_appSetting.Settings[key] != null)//如果存在此节点，则修改 
            {
                m_appSetting.Settings[key].Value = value;
            }
            else//如果不存在此节点，则添加 
            {
                AddAppSetting(key, value);
            }
        }

        /// <summary> 
        /// 删除应用程序配置节点
        /// </summary> 
        /// <param name="key">节点名称</param> 
        public void RemoveAppSetting(string key)
        {
            if (m_appSetting.Settings[key] != null)//如果存在此节点，则删除
            {
                m_appSetting.Settings.Remove(key);
            }
            else//如果不存在此节点，则抛出异常
            {
                throw new Exception(NULL_TEXT + key);
            }
        }

        /// <summary> 
        /// 修改数据库连接字符串节点，如果不存在此节点，则会添加此节点及对应的值 
        /// </summary> 
        /// <param name="key">节点名称</param> 
        /// <param name="value">节点值</param> 
        public void SetConnectionString(string key, string connectionString)
        {
            ConnectionStringsSection connectionSetting = m_config.ConnectionStrings;
            if (connectionSetting.ConnectionStrings[key] != null)//如果存在此节点，则修改 
            {
                connectionSetting.ConnectionStrings[key].ConnectionString = connectionString;
            }
            else//如果不存在此节点，则添加 
            {
                AddConnectionString(key, connectionString);
            }
        }

        /// <summary> 
        /// 保存所作的修改 
        /// </summary> 
        public void Save()
        {
            m_config.Save();
        }
    } 
}
